package cn.kbblog.biz;

import java.util.List;

import org.beetl.sql.core.db.KeyHolder;
import org.beetl.sql.core.mapper.BaseMapper;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * BeetlSQL通用Biz
*/
public abstract class BaseBiz<T> {
	@Autowired
	private BaseMapper<T> mapper;
	
	/**
	 * 根据主键获取对象，不存在时返回null，参考hibernate命名
	 * @param pk
	 * @return
	 */
	public T get(Object pk){
		return mapper.single(pk);
	}
	/**
	 * 其实和get是一样的，但是不存在时会抛出异常，参考hibernate命名
	 * @param pk
	 * @return
	 */
	public T load(Object pk){
		return mapper.unique(pk);
	}
	
	/**
	 * 根据条件获取一个对象，查询不到返回null
	 * @param param
	 * @return
	 */
	public T getOne(T param){
		List<T> list = mapper.template(param);
		return list.size()==0?null:list.get(0);
	}
	
	/**
	 * 获取全部列表
	 * @return
	 */
	public List<T> list(){
		return mapper.all();
	}
	
	/**
	 * 根据页码获取页码的list
	 * @param pageSize 每页的大小
	 * @param page 页码
	 * @return
	 */
	public List<T> list(Integer pageSize,Integer page){
		return mapper.all((page-1)*pageSize, pageSize);
	}
	
	/**
	 * 根据条件查询列表
	 * @param pojo
	 * @return
	 */
	public List<T> list(T pojo){
		return mapper.template(pojo);
	}
	
	/**
	 * 根据条件查询列表
	 * @param pojo
	 * @param pageSize
	 * @param page
	 * @return
	 */
	public List<T> list(T pojo,Integer pageSize,Integer page){
		return mapper.template(pojo,(page-1)*pageSize, pageSize);
	}
	
	/**
	 * 获取所有的数量
	 * @return
	 */
	public Long count(){
		return mapper.allCount();
	}
	/**
	 * 根据条件获取所有的数量
	 * @param pojo
	 * @return
	 */
	public Long count(T pojo){
		return mapper.templateCount(pojo);
	}
	/**
	 * 插入对象
	 * @param pojo
	 */
	public void insert(T pojo){
		mapper.insert(pojo);
	}
	/**
	 * 插入并获取主键
	 * @param pojo
	 * @return
	 */
	public KeyHolder insertReturnKey(T pojo){
		return mapper.insertReturnKey(pojo);
	}
	/**
	 * 批量插入对象
	 * @param pojos
	 */
	public void insert(List<T> pojos){
		mapper.insertBatch(pojos);
	}
	
	/**
	 * 根据主键删除对象
	 * @param pk
	 * @return
	 */
	public int delete(Object pk){
		return mapper.deleteById(pk);
	}
	
	/**
	 * 根据主键更新对象，实体中为null的也会将数据库置为null
	 * @param pojo
	 * @return
	 */
	public int update(T pojo){
		return update(pojo, true);
	}
	/**
	 * 根据主键更新对象，根据updateNull的设置来处理对象属性中空值的问题
	 * updateNull 为 true时 pojo中的null属性会更新到数据库
	 * updateNull 为 false时 pojo中的null属性会忽略
	 * @param pojo
	 * @param updateNull  是否将null的属性更新到数据库
	 * @return
	 */
	public int update(T pojo,Boolean updateNull){
		if(updateNull){
			return mapper.updateById(pojo);
		}else{
			return mapper.updateTemplateById(pojo);
		}
	}
	
	/**
	 * 使用SQL语句来查询
	 * @param sql
	 * @param params
	 * @return
	 */
	public List<T> listBySQL(String sql,Object...params){
		return mapper.execute(sql, params);
	}
	
	/**
	 * 使用SQL语句来进行增删改
	 * @param sql
	 * @param params
	 * @return
	 */
	public int updateBySQL(String sql,Object...params){
		return mapper.executeUpdate(sql, params);
	}
}
